import Vue from "vue";
import Vuex from "vuex";
import createPersistedState from "vuex-persistedstate";
import { uuid } from "@/utils/index";

Vue.use(Vuex);

export default new Vuex.Store({
  plugins: [
    // 本地存储
    createPersistedState({
      storage: window.localStorage,
    }),
  ],
  state: {
    myTodoList: [],
  },
  getters: {
    // 生成一个符合我们逻辑的数组
    moduleList: (state) => {
      // 获取时间戳  '2022-03-08' 字符串转成时间戳
      function getTimeStamp(date) {
        if (typeof date != "string") {
          return "";
        }
        return new Date(date).getTime();
      }

      let v = "";
      const arr = [];
      // 深拷贝原先的数组
      const _myTodoList = JSON.parse(JSON.stringify(state.myTodoList));
      // 对该数组进行排序
      _myTodoList.sort(
        (a, b) => getTimeStamp(a.doneTime) - getTimeStamp(b.doneTime)
      );
      // 生成指定的数组
      _myTodoList.forEach((e, index) => {
        // 判断时间是否相等
        if (v !== e.doneTime) {
          v = e.doneTime;
          const _obj = {
            doneTime: e.doneTime,
            obj: [],
          };
          for (let i = index; i < _myTodoList.length; i++) {
            if (_myTodoList[i].doneTime === v) {
              _obj.obj.push(_myTodoList[i]);
            }
          }
          arr.push(_obj);
        }
      });
      // 返回我们操作完的数组
      return arr;
    },
    // 未有完成的情况下不允许点击
    isDoneAnyThing: (state) => (doneTime) => {
      // 生成一个我们所有已经点击完成的数组
      const arr = state.myTodoList.filter((item) => item.isDone);
      // 找到点击完成的数组里的对象内一个doneTime键值对是否与我们的参数键值对相等
      const index = arr.findIndex((e) => e.doneTime === doneTime);
      return index === -1;
    },
  },
  mutations: {
    // 修改引用地址  后期AXIOS 使用
    SET_MY_TODO_LIST: (state, list) => {
      state.myTodoList = list;
    },
    // 往myTodoList添加新的值
    PUST_MY_TODO_LIST: (state, obj) => {
      obj.uuid = uuid();
      state.myTodoList.push(obj);
    },
    // 删除已经完成的
    DELE_THIS_DAYWORK: (state, doneTime) => {
      // 找到所有不同的doneTime键值对对象和相同doneTime相同但是并没有完成的对象 生成一个数组
      state.myTodoList = state.myTodoList.filter(
        (item) =>
          (item.doneTime === doneTime && !item.isDone) ||
          item.doneTime != doneTime
      );
    },
    // 在指定位置添加新值
    CHANGE_WORK: (state, obj) => {
      const uuid = obj.uuid;
      // 获取第一个uuid 相等的下标
      const _objIndex = state.myTodoList.findIndex(
        (item) => item.uuid === uuid
      );
      state.myTodoList.splice(_objIndex, 1, obj);
    },
    // switch改变
    SWITCH_CHANGE: (state, uid) => {
      // 找到第一个uuid 与传入的 uid 相同的对象的下标
      const _index = state.myTodoList.findIndex(
        (element) => uid == element.uuid
      );
      // 然后取反
      state.myTodoList[_index].isDone = !state.myTodoList[_index].isDone;
    },
  },
  actions: {},
  modules: {},
});
